package com.linkgie.galaxyframework.kvstorage;

import java.util.Iterator;
import java.util.Objects;
import java.util.function.Consumer;

/**
 * 键的迭代器；
 * 
 * @author huanghaiquan
 *
 * @param <K> 键的类型；
 */
public interface KeyIterator<K, V> extends Iterator<K> {

	/**
	 * 是否有下一个；
	 */
	@Override
	boolean hasNext();

	/**
	 * 下一个键（key）；
	 * <p>
	 * 
	 * 如果已经处于迭代序列的末尾，则返回 null；
	 */
	@Override
	K next();

	/**
	 * 下一个键值对；
	 * <p>
	 * 
	 * 如果已经处于迭代序列的末尾，则返回 null；
	 * <p>
	 * 
	 * @return
	 */
	KVEntry<K, V> nextEntry();

	/**
	 * 对余下的每一个键（key）进行处理；
	 */
	@Override
	default void forEachRemaining(Consumer<? super K> action) {
		Iterator.super.forEachRemaining(action);
	}

	/**
	 * 对余下的每一个键值对（key-value entries）进行处理；
	 * 
	 * @param action
	 */
	default void forEachRemainingEntries(Consumer<KVEntry<K, V>> action) {
		Objects.requireNonNull(action);
		while (hasNext())
			action.accept(nextEntry());
	}
}
